#include <stdlib.h> 
#include "elog.h"
#include "shell.h"
/**
 * @brief  帮助命令（显示所有支持的命令）
 * @param  argc: 参数数量
 * @param  argv: 参数数组
 * @return 0：成功
 */
int help(int argc, char** argv)
{
    taskENTER_CRITICAL();
    printf("shell commands:\r\n");
    {
        struct finsh_syscall* index;

        // 遍历命令表，打印所有命令（去掉__cmd_前缀）
        for (index = _syscall_table_begin;
            index < _syscall_table_end;
            FINSH_NEXT_SYSCALL(index)) {
            // 跳过非命令表项
            if (strncmp(index->name, "__cmd_", 6) != 0)
                continue;
            // 打印命令名（从第6个字符开始，即去掉__cmd_）和描述
            printf("  %-16s - %s\r\n", &index->name[6], index->desc);
        }
    }
    printf("\r\n");
    taskEXIT_CRITICAL();
    return 0;
}

char str[100];

int tasks_info(int argc, char** argv)
{
    vTaskList(str);
    taskENTER_CRITICAL();
    printf("TaskName      State  Priority  Stack  Number \r\n%s\r\n", str);
    taskEXIT_CRITICAL();
    return 0;
}

int show_memory(int argc, char** argv)
{
    taskENTER_CRITICAL();
    printf("FreeHeapSize = %d   EverFreeHeapSize = %d\r\n", xPortGetFreeHeapSize(), xPortGetMinimumEverFreeHeapSize());
    taskEXIT_CRITICAL();
    return 0;
}

/**
 * @desc  : 对参数传入进行测试
 * @date  : 2025-11-10
 * @author: AnRui
 * @param : argc - {参数说明}:
 * @param : argv - {参数说明}:
 * @note  : argc=1时 argv[0]为命令字符串
 *          argc=2时 argv[1]为参数1的字符串 使用的时候需要转为对应的类型
 *          。。。。
 *          使用atoi atof这种数据装换的函数 如何字符不支持转换 直接返回0 不报错
 */
int test(int argc, char** argv)
{
    // argc=1 表示只有命令
    printf("parameter num is %d\r\n", argc);
    if (argc >= 2) printf("first parmeter is %d\r\n", atoi(argv[1])); // 字符串转整数
    if (argc >= 3) printf("second parmeter is %02f\r\n", atof(argv[2])); // 字符串转float
    return 0;
}


/**
 * @desc  : 修改easylogger输出等级
 * @date  : 2025-11-14
 * @author: AnRui
 * @param : argc - {参数说明}:
 * @param : argv - {参数说明}:
 * @return: int
 * @note  :
 */
int modify_elog(int argc, char** argv)
{
    if (argc >= 2) {
        elog_set_filter_lvl(atoi(argv[1]));
    }
    return 0;
}

int clear(int argc, char** argv)
{
    // ANSI转义序列：清屏+光标归位
    // \33[2J：清除整个屏幕（包括历史内容）
    // \33[1;1H：将光标移动到第1行第1列（左上角）
    printf("\33[2J\33[1;1H");
    return 0;
}

// 注册help命令 导出到命令表 
CLI_CMD_EXPORT(help, all supported commands);
// 查看所有任务状态
CLI_CMD_EXPORT(tasks_info, show tasklist);
// 查看内存使用情况
CLI_CMD_EXPORT(show_memory, show heap size);
//// 测试
//CLI_CMD_EXPORT(test, test shell parameters);
// 修改elog 的输出级别
CLI_CMD_EXPORT(modify_elog, modify elog output level(0 - 5: Assert / Error / Warn / Info / Debug / Verbose));
CLI_CMD_EXPORT(clear, "Clear terminal screen (clear)");
